声明的结构
一个声明由四个部分组成:一个可选的“描述符”,一个基础类型,一个声明符,还有一个可选的初始式。除了函数和名字空间之外,其他声明都应该由分号结束。例如,
chr* kings[] = { "Antigonus", "Seleucus", "Ptolemy" };
这里的基础类型是char,声明符是*kings[],而初始式是 = { ... }。
描述符是一个开始关键字,例如virtual(2.5.5节、12.2.6节)和extern(9.2节),它们说明了被声明事物的某些非类型的属性。
声明符由一给名字和可选的若干声明运算符组成。最常用的声明运算符是(A.7.1节)
* 指针 前缀
*const 常量指针 前缀
& 引用 前缀
[] 数组 后缀
() 函数 后缀
如果这些东西都是前缀或者都是后缀,其使用就会很简单。但是,、[]和()被设计为模仿它们在表达式(6.2节)里的使用方式。这样,就是前缀的,而[]和()都是后缀的。而且后缀的声明运算符比前缀的那些声明运算符约束力更强。因此,*kings[] 就是一个指向什么东西的指针数组。还有,我们有时就必须使用括号,例如要表示“指向函数的指针”,见5.1节的例子。完整的细节请看附录A。
请注意,在一个声明中不能没有类型。例如,
const c = 7; // 错误❌:无类型
gt(int a, int b) { return (a>b)? a : b; } // 错误❌:无返回类型
unsigned ui; // 可以:'unsigined' 就是 'unsigned int'
long li; // 可以:'long' 就是 'long int'
在这里,标准C++与C和C++的早期版本有所不同,原来一直将前面两个例子看成以int作为没有明确说明的类型(B.2节)。这种“隐式的int”是许多微妙错误和混乱的一个根源。
🔚